package com.oukingtim.util

/**
 * Created by oukingtim
 */
object StringTools {

    /**
     * 将驼峰式命名的字符串转换为下划线大写方式。如果转换前的驼峰式命名的字符串为空，则返回空字符串。
     * 例如：HelloWorld->HELLO_WORLD
     * @param name 转换前的驼峰式命名的字符串
     * *
     * @return 转换后下划线大写方式命名的字符串
     */
    fun underscoreName(name: String?): String {
        val result = StringBuilder()
        if (name != null && name.length > 0) {
            // 将第一个字符处理成大写
            result.append(name.substring(0, 1).toUpperCase())
            // 循环处理其余字符
            for (i in 1..name.length - 1) {
                val s = name.substring(i, i + 1)
                // 在大写字母前添加下划线
                if (s == s.toUpperCase() && !Character.isDigit(s[0])) {
                    result.append("_")
                }
                // 其他字符直接转成大写
                result.append(s.toUpperCase())
            }
        }
        return result.toString()
    }

    /**
     * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空，则返回空字符串。
     * 例如：HELLO_WORLD->HelloWorld
     * @param name 转换前的下划线大写方式命名的字符串
     * *
     * @return 转换后的驼峰式命名的字符串
     */
    fun camelName(name: String?): String {
        val result = StringBuilder()
        // 快速检查
        if (name == null || name.isEmpty()) {
            // 没必要转换
            return ""
        } else if (!name.contains("_")) {
            // 不含下划线，仅将首字母小写
            return name.substring(0, 1).toLowerCase() + name.substring(1)
        }
        // 用下划线将原始字符串分割
        val camels = name.split("_".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
        for (camel in camels) {
            // 跳过原始字符串中开头、结尾的下换线或双重下划线
            if (camel.isEmpty()) {
                continue
            }
            // 处理真正的驼峰片段
            if (result.length == 0) {
                // 第一个驼峰片段，全部字母都小写
                result.append(camel.toLowerCase())
            } else {
                // 其他的驼峰片段，首字母大写
                result.append(camel.substring(0, 1).toUpperCase())
                result.append(camel.substring(1).toLowerCase())
            }
        }
        return result.toString()
    }
}